<!DOCTYPE html>
<html>
<head>
    <title>电梯传奇 - 电梯调度编程游戏</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="font-awesome-4.1-1.0/css/font-awesome.min.css" type="text/css" media="all">
    <link href='//fonts.googleapis.com/css?family=Oswald:400,700,300' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" href="style.css" type="text/css" media="all">

    <link rel="stylesheet" href="libs/highlight/styles/default.css" type="text/css" media="all">
    <link rel="stylesheet" href="libs/highlight/styles/solarized_light.css" type="text/css" media="all">

    <script type="text/javascript" src="libs/highlight/highlight.pack.js"></script>
    <script>hljs.initHighlightingOnLoad();</script>
</head>
<body>
    <div class="container" style="width: 960px">
        <div class="header">
            <h1>电梯传奇<em class="emphasis-color"> - 帮助（API）文档</em></h1>
        </div>

        <div class="help">
            <h2>游戏介绍</h2>
            <p>
                这是一个编程游戏！<br>
                你的任务是通过使用<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide">JavaScript</a>编写程序来控制电梯（1或n）的运动。 .
            </p>
            <p>
                目标是以高效的方式运送乘客。
                根据你的表现，你可以逐渐挑战更加困难的关卡。
                足够优秀的程序才能完成所有挑战。
            </p>

            <h2>玩法说明</h2>
            <p>
                在游戏视图下方输入窗口中输入代码，然后点击 <span class="emphasis-color">“应用”</span> 按钮 运行代码。<br>
                你可以通过按下<i class="fa fa-plus emphasis-color"></i>或<i class="fa fa-minus emphasis-color"></i>按钮调整程序运行速度。
            </p>
            <p>
                如果程序出现错误，可以使用浏览器开发工具进行调试。<br>
                如果想重新开始编码，点击<span class="emphasis-color">“重置”</span>按钮将代码恢复到初始化状态。<br>
                如果你喜欢使用<a href="http://www.sublimetext.com/">Sublime Text</a>等文本编辑器，请随意在那里编辑代码，并将其粘贴到游戏编辑器中。<br>
                所有代码会自动保存在本地存储中，所以不用担心 - 即使意外关闭浏览器也不会丢失。
            </p>
            <h2>基础知识</h2>
            <p>
                每个程序必须声明一个包含至少两个名为<span class="emphasis-color">init</span> 和 <span class="emphasis-color">update</span>函数的对象，就像这样：:
            </p>
            <div><pre><code>{
    init: function(elevators, floors) {
        // Do stuff with the elevators and floors, which are both arrays of objects
    },
    update: function(dt, elevators, floors) {
        // Do more stuff with the elevators and floors
        // dt is the number of game seconds that passed since the last time update was called
    }
}</code></pre></div>
            <p>
                这些函数将在运行期间由系统调用。<br>
            <span class="emphasis-color">init</span> 在挑战开始时被调用， <span class="emphasis-color">update</span> 在挑战期间重复调用。
            </p>
            <p>
                通常情况下，大部分代码放在 <span class="emphasis-color">init</span> 函数中，以设置事件监听器和逻辑。
            </p>
            <h2>编码示例</h2>
            <h3>如何控制电梯运行</h3>
            <dl>
                <dt><pre><code>elevator.goToFloor(1);</code></pre></dt>
                    <dd>控制电梯在完成其他任务后(如果有的话)移到1层, 请注意，如果电梯楼层队列已经存在该楼层，则此操作将不起作用。</dd>
                <dt><pre><code>if(elevator.currentFloor() > 2) { ... }</code></pre></dt>
                    <dd>调用currentFloor获取电梯当前所在的楼层号。请注意，这是一个四舍五入的数字，并不一定意味着电梯处于停止状态。</dd>
            </dl>
            <h3>事件监听</h3>
            <p>它可以监听事件，比如停在某层，或者按钮被按下时执行动作。</p>
            <dl>
                <dt><pre><code>elevator.on("idle", function() { elevator.goToFloor(0); });</code></pre></dt>
                    <dd>当楼层队列被清空并且电梯不做任何事情时，监听电梯发出的“idle”事件。在这个例子中，控制电梯移动到第0层。</dd>
                <dt><pre><code>elevator.on("floor_button_pressed", function(floorNum) { ... } );</code></pre></dt>
                    <dd>监听“floor_button_pressed”事件，当乘客在电梯内按下按钮时发出。这表明乘客想去那一层。</dd>
                <dt><pre><code>floor.on("up_button_pressed", function() { ... } );</code></pre></dt>
                    <dd>监听“up_button_pressed”事件，当乘客按下他们所在楼层的向上按钮时发出。这表明乘客想去另一层。</dd>
            </dl>

            <h2 id="docs">API文档</h2>
            <h3>电梯对象</h3>
            <table class="doctable">
                <thead><th width="150">Property</th><th width="90">Type</th><th width="190">Explanation</th><th width="*">Example</th></thead>
                <tbody>
                    <tr><td>goToFloor</td><td>function</td><td><small>
                        让电梯排队进入指定楼层。如果您将true指定为第二个参数，则电梯将直接到达该楼层，然后再前往任何其他排队的楼层。
                    </small></td><td><pre><code>elevator.goToFloor(3); // Do it after anything else
elevator.goToFloor(2, true); // Do it before anything else</code></pre></td></tr>
                    <tr><td>stop</td><td>function</td><td><small>
                        清除目的地队列，如果电梯正在移动，请停止电梯。请注意，您通常不需要停止电梯-它用于具有运输中重新调度逻辑的高级解决方案。另外，请注意电梯可能不会停在某一层，所以乘客不会下车。    
                    </small></td><td><pre><code>elevator.stop();</code></pre></td></tr>
                    <tr><td>currentFloor</td><td>function</td><td><small>
                        获取电梯当前所在的楼层号。
                    </small></td><td><pre><code>if(elevator.currentFloor() === 0) {
    // Do something special?
}</code></pre></td></tr>
                    <tr><td>goingUpIndicator</td><td>function</td><td><small>
                        获取或设置上升指示，该指示会影响在楼层停靠的乘客的行为。
                    </small></td><td><pre><code>if(elevator.goingUpIndicator()) {
    elevator.goingDownIndicator(false);
}</code></pre></td></tr>
                    <tr><td>goingDownIndicator</td><td>function</td><td><small>
                        获取或设置下行指示，该指示会影响在楼层停靠的乘客的行为。
                    </small></td><td><pre><code>if(elevator.goingDownIndicator()) {
    elevator.goingUpIndicator(false);
}</code></pre></td></tr>
                    <tr><td>maxPassengerCount</td><td>function</td><td><small>
                        获取可同时占用电梯的最大乘客数。
                    </small></td><td><pre><code>if(elevator.maxPassengerCount() > 5) {
    // Use this elevator for something special, because it's big
}</code></pre></td></tr>
                    <tr><td>loadFactor</td><td>function</td><td><small>
                        得到电梯的载重系数。0表示空，1表示满。随着乘客体重的变化而变化，这不是一个精确的测量。
                    </small></td><td><pre><code>if(elevator.loadFactor() < 0.4) {
    // Maybe use this elevator, since it's not full yet?
}</code></pre></td></tr>
                    <tr><td>destinationDirection</td><td>function</td><td><small>
                        得到电梯当前要移动的方向。可以是"up"， "down"或"stopped"。
                    </small></td></tr>
                    <tr><td>destinationQueue</td><td>array</td><td><small>
                        当前目的地队列，即电梯计划到达的楼层号。如果需要，可以修改和清空。注意，您需要调用checkDestinationQueue()以使更改立即生效。
                    </small></td><td><pre><code>elevator.destinationQueue = [];
elevator.checkDestinationQueue();</code></pre></td></tr>
                    <tr><td>checkDestinationQueue</td><td>function</td><td><small>
                        检查目的地队列中是否有要转到的新目的地。注意，只有在显式修改目标队列时才需要调用此方法。
                    </small></td><td><pre><code>elevator.checkDestinationQueue();</code></pre></td></tr>
                    <tr><td>getPressedFloors</td><td>function</td><td><small>
                        获取当前按下的层数作为数组。
                    </small></td><td><pre><code>if(elevator.getPressedFloors().length > 0) {
    // Maybe go to some chosen floor first?
}</code></pre></td></tr>
                </tbody>
            </table>
            <table class="doctable">
                <thead><th width="150">Event</th><th width="280">Explanation</th><th>Example</th></thead>
                <tbody>
                    <tr><td>idle</td><td><small>
                        当电梯完成了所有的任务并且没有做任何事情时触发。
                    </small></td><td><pre><code>elevator.on("idle", function() { ... });</code></pre></td></tr>
                    <tr><td>floor_button_pressed</td><td><small>
                        当乘客在电梯内按下按钮时触发。
                    </small></td><td><pre><code>elevator.on("floor_button_pressed", function(floorNum) {
    // Maybe tell the elevator to go to that floor?
})</code></pre></td></tr>
                    <tr><td>passing_floor</td><td><small>
                        电梯将要通过某层时触发。这是决定是否在这一层停止的好时机。注意，此事件不会在目的层触发。方向不是“up”就是“down”。
                    </small></td><td><pre><code>elevator.on("passing_floor", function(floorNum, direction) { ... });</code></pre></td></tr>
                    <tr><td>stopped_at_floor</td><td><small>
                        当电梯到达某一楼层时触发。
                    </small></td><td><pre><code>elevator.on("stopped_at_floor", function(floorNum) {
    // Maybe decide where to go next?
})</code></pre></td></tr>
                </tbody>
            </table>
            <h3>Floor object</h3>
            <table class="doctable">
                <thead><th width="150">Property</th><th width="90">Type</th><th width="190">Explanation</th><th width="*">Example</th></thead>
                <tbody>
                <tr><td>floorNum</td><td>function</td><td><small>
                    获取楼层对象的楼层号。
                </small></td><td><pre><code>if(floor.floorNum() > 3) { ... }</code></pre></td></tr>
                </tbody>
            </table>
            <table class="doctable">
                <thead><th width="150">Event</th><th width="280">Explanation</th><th>Example</th></thead>
                <tbody>
                    <tr><td>up_button_pressed</td><td><small>
                        当有人在楼层按下向上按钮时触发。请注意，如果乘客未能进入电梯，他们将再次按下按钮。
                    </small></td><td><pre><code>floor.on("up_button_pressed", function() {
    // Maybe tell an elevator to go to this floor?
})</code></pre></td></tr>
                    <tr><td>down_button_pressed</td><td><small>
                        当有人在楼层按下向下按钮时触发。请注意，如果乘客未能进入电梯，他们将再次按下按钮。
                    </small></td><td><pre><code>floor.on("down_button_pressed", function() {
    // Maybe tell an elevator to go to this floor?
})</code></pre></td></tr>

                </tbody>
            </table>
        </div>
        <div class="footer">
            <h4>作者： Magnus Wolffelt and contributors</h4>
            <h4><a href="https://github.com/magwo/elevatorsaga">GitHub源码</a></h4>
            <h4><a href="/elevator/index.html">继续游戏</a></h4>
            <h4><a href="/">返回首页</a></h4>
        </div>
    </div>

    <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

        ga('create', 'UA-56810935-1', 'auto');
        ga('send', 'pageview');
    </script>
    <a href="https://github.com/magwo/elevatorsaga" class="github-corner" aria-label="View source on GitHub">
        <svg width="80" height="80" viewBox="0 0 250 250" style="fill:#151513; color:#eee; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg>
    </a>
</body>
</html>
